/**
 * Copyright 2005 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.edi.utils
{
	import ascb.util.ArrayUtilities;
	
	/**
	 * MAP对象工具类. 
	 * 
	 */	
	public class HashMap implements Map
	{
		private var keyArray:Array;
		private var obj:Object;
		private var len:int;

		public function HashMap()
		{
			obj=new Object();
			len=0;
			this.keyArray = new Array();
		}

		/**
		 * 将指定的值与此映射中的指定键相关联.
		 * @param key 与指定值相关联的键.
		 * @param value 与指定键相关联的值.
		 */
		public function put(key:String, value:Object):void
		{
			var temp=obj[key];
			if (temp == undefined)
			{
				keyArray.push(key);
				obj[key]=value;
				len++;
			}
		}

		/**
		 * 返回此映射中映射到指定键的值.
		 * @param key 与指定值相关联的键.
		 * @return 此映射中映射到指定值的键，如果此映射不包含该键的映射关系，则返回 null.
		 */
		public function find(key:String):Object
		{
			return obj[key];
		}
		
		public function findByIndex(index:int):Object{
			if(index<keyArray.length){
				return obj[keyArray[index]];
			}else{
				return null;
			}
		}
		public function findKeyByValue(obj:Object):String{
			
//			for(var i:int=0;i<this.size();i++){
//				if(find()){
//					
//				}
//			}
			return null;
		}
		/**
		 * 从此映射中移除所有映射关系
		 */
		public function clear():void
		{
			for (var temp:String in obj)
			{
				delete obj[temp];
				keyArray.splice(0,keyArray.length);
			}
			len=0;
		}

		/**
		 * 如果存在此键的映射关系，则将其从映射中移除
		 * @param key 从映射中移除其映射关系的键
		 * @return 以前与指定键相关联的值，如果没有该键的映射关系，则返回 null
		 */
		public function remove(key:String):Object
		{
			var temp=obj[key];
			if (temp != undefined)
			{
				delete obj[key];
				var keyArrayLength:Number = ArrayUtilities.findMatchIndex(keyArray,key);
				keyArray.splice(keyArrayLength,1);
				this.len-=1;
			}
			return temp;
		}

		/**
		 * 返回此映射中的键-值映射关系数.
		 * @return 此映射中的键-值映射关系的个数.
		 */
		public function size():Number
		{
			return len;
		}
		
		/**
		 * 获得该hashmap中的最后一个元素值value
		 * 
		 */
		public function getLastValue():Object{
			var i:int=0;
			var lastObj:Object;
			var keyTemp:Object = keyArray.pop();
			keyArray.push(keyTemp);
			return obj[keyTemp];
		}
		/****
		 * 
		 * 获得map对象最后一个key
		 */
		public function getLastKey():String{
			var keyTemp:Object = keyArray.pop();
			keyArray.push(keyTemp);
			return keyTemp as String;
		}
		
		/****
		 * 返回本对象中的第一个key
		 * 
		 */
		public function getFirstKey():String{
			var keyTemp:Object = keyArray.shift();
			
			keyArray.unshift(keyTemp);
			
			return keyTemp as String;
		}
		
		/****
		 * 返回本对象中的第一个value值
		 */
		public function getFirstValue():Object{
			var keyTemp:Object = keyArray.shift();
			keyArray.unshift(keyTemp);
			var valueTemp:Object = this.obj[keyTemp];
			return valueTemp;
		}
		/**
		 * 如果此映射未包含键-值映射关系，则返回 true.
		 * @return 如果此映射未包含键-值映射关系，则返回 true.
		 */
		public function isEmpty():Boolean
		{
			if (len != 0 && keyArray.length!=0)
			{
				return true;
			}
			return false;
		}

		/**
		 * 如果此映射包含指定键的映射关系，则返回 true.
		 * @param key 测试在此映射中是否存在的键.
		 * @return 如果此映射包含指定键的映射关系，则返回 true.
		 */
		public function containsKey(key:String):Boolean
		{
			var temp=obj[key];
			if (temp != undefined)
			{
				return true;
			}
			return false;
		}

		/**
		 * 如果该映射将一个或多个键映射到指定值，则返回 true.
		 * @param key 测试在该映射中是否存在的值
		 * @return 如果该映射将一个或多个键映射到指定值，则返回 true.
		 */
		public function containsValue(value:Object):Boolean
		{
			for (var temp:String in obj)
			{
				if (obj[temp] == value)
				{
					return true;
				}
			}
			return false;
		}

		/**
		 * 返回此映射中包含的所有值.
		 * @param key 从映射中移除其映射关系的键
		 * @return 以前与指定键相关联的值，如果没有该键的映射关系，则返回 null
		 */
		public function values():Array
		{
			var ary:Array=new Array();
			for(var i:int=0;i<keyArray.length;i++)
			{
				ary.push(obj[keyArray[i]]);
			}
			return ary;
		}
		
		/**
		 * 返回此映射中包含的所有key.

		 * @return 该对象中所有的key
		 */
		public function keySet():Array{
			return keyArray;
		}
		
		/****
		 * 获得下一个Key
		 */
		public function nextKey(currentKey:String):String{
			//TODO
			return null;
		}
		/****
		 * 获得前一个key
		 */
		public function previousKey(currentKey:String):String{
			//TODO
			return null;
		}
		
	}

}
